2022/01/[路飞][LeetCode]1124_表现良好的最长时间段/index

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

示例 1:

1
2
3
输入: hours = [9,9,6,0,6,6,9]
输出: 3
解释: 最长的表现良好时间段是 [9,9,6]。

示例 2:

1
2
输入: hours = [6,6,6]
输出: 0

提示:

  • 1 <= hours.length <= 104
  • 0 <= hours[i] <= 16

解题思路

  • 我们使用 前缀和 来解题(可能有小伙伴要问了,这个前缀和是啥,顾名思义,钱💰坠落到河里就是前缀和 认真脸)
  • 回归正题,这个前缀和就是数组前 n项的和
  • 我们先将输入的数组调整一下,大于8的转换成1否则为-1
  • 计算转换后的数组的前缀和数组
  • 前缀和数组中两项的差为,转换后数组对应位置两项极其之间数据的和
  • 表现良好的时间段为和大于1的时间段
  • 题目要的正是两项极其之间数据的和大于1的最大距离

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var longestWPI = function(hours) {
hours = hours.map(v=>{
return v>8?1:-1
})
if(!hours.includes(1)) return 0
let pre_sums = [0]
for(let i=0;i<hours.length;i++){
const a = hours[i]
const b = pre_sums[i]==undefined?0:pre_sums[i]
pre_sums[i+1] = a+b
}
let len =0
for(let i =0;i<pre_sums.length-1;i++){
for(let j=i+1;j<pre_sums.length;j++){
if(pre_sums[j]-pre_sums[i]>0){
len = Math.max(len,j-i)
}
}
}
return len
};

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]1124_%E8%A1%A8%E7%8E%B0%E8%89%AF%E5%A5%BD%E7%9A%84%E6%9C%80%E9%95%BF%E6%97%B6%E9%97%B4%E6%AE%B5/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog